home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1997 December
/
MACPOWER-1997-12.ISO.7z
/
MACPOWER-1997-12.ISO
/
AMUG
/
PROGRAMMING
/
Raven 1.2.sit
/
Raven 1.2
/
Source
/
Foundation
/
Common
/
ZNewAndDelete.cpp
< prev
next >
Wrap
Text File
|
1997-08-02
|
4KB
|
181 lines
/*
* File: ZNewAndDelete.cpp
* Summary: Default Raven global operator new.
* Written by: Jesse Jones
*
* Copyright ゥ 1997 Jesse Jones.
* For conditions of distribution and use, see copyright notice in ZTypes.h
*
* Change History (most recent first):
*
* <2> 8/01/97 JDJ Added gValidateHeapOnDelete.
* <1> 1/28/97 JDJ Created
*/
#include <ZNewAndDelete.h>
#include <ZDebug.h>
#include <ZExceptions.h>
#include <ZMemoryHeap.h>
//-----------------------------------
// Globals
//
TMemoryHeap* gObjectHeap = nil;
#if DEBUG
bool gValidateHeapOnNew = false;
bool gValidateHeapOnDelete = false;
bool gFreeDeletedBlocks = true;
#endif
// ===================================================================================
// Global New and Delete
// ===================================================================================
//---------------------------------------------------------------
//
// operator new (size_t)
//
//---------------------------------------------------------------
#if RAVEN_OPERATOR_NEW && 1
void* operator new(size_t size) throw(bad_alloc)
{
return RavenOperatorNew(size);
}
#endif
//---------------------------------------------------------------
//
// operator new (size_t, nothrow_t)
//
//---------------------------------------------------------------
#if RAVEN_OPERATOR_NEW && 0 // ・・・ハCW 11 gives a warning that this is already defined
void* operator new(size_t size, const nothrow_t&) throw()
{
void* ptr = nil;
try {
ptr = RavenOperatorNew(size);
} catch (...) {
}
return ptr;
}
#endif
//---------------------------------------------------------------
//
// operator delete
//
//---------------------------------------------------------------
#if RAVEN_OPERATOR_NEW && 1
void operator delete(void* obj)
{
RavenOperatorDelete(obj);
}
#endif
#pragma mark -
// ===================================================================================
// class TDisableLeakChecking
// ===================================================================================
//---------------------------------------------------------------
//
// TDisableLeakChecking::~TDisableLeakChecking
//
// It's be nicer to stub these out in the header, but that causes
// problems if you use them in a library.
//
//---------------------------------------------------------------
TDisableLeakChecking::~TDisableLeakChecking()
{
#if DEBUG
(gObjectHeap->mLeakChecking)++;
#endif
}
//---------------------------------------------------------------
//
// TDisableLeakChecking::TDisableLeakChecking
//
//---------------------------------------------------------------
TDisableLeakChecking::TDisableLeakChecking()
{
#if DEBUG
ASSERT(gObjectHeap != nil);
(gObjectHeap->mLeakChecking)--;
#endif
}
#pragma mark -
// ===================================================================================
// Global Functions
// ===================================================================================
//---------------------------------------------------------------
//
// RavenOperatorNew
//
//---------------------------------------------------------------
void* RavenOperatorNew(size_t size)
{
ASSERT(gObjectHeap != nil); // should have been created by FragInit (in ZBootStrap.cpp)
void* block = nil;
#if DEBUG
if (gValidateHeapOnNew)
gObjectHeap->ValidateHeap();
#endif
// Try to create the block. Will throw if the new handler
// can't free up any memory or there is no new handler.
while (block == nil) {
block = gObjectHeap->Allocate(size);
if (block == nil) {
new_handler handler = set_new_handler(nil); // there's no get_new_handler!
set_new_handler(handler);
if (handler != nil)
(*handler)(); // if handler can't free up any memory it will throw
else
throw TSysMemoryException();
}
}
return block;
}
//---------------------------------------------------------------
//
// RavenOperatorDelete
//
//---------------------------------------------------------------
void RavenOperatorDelete(void* obj)
{
ASSERT(gObjectHeap != nil);
#if DEBUG
if (gValidateHeapOnDelete)
gObjectHeap->ValidateHeap();
if (gFreeDeletedBlocks)
#endif
gObjectHeap->Deallocate(obj);
}